#include <iostream>

using namespace std;

const int N = 10;

int n = 9;
int a[N][N];
bool row[N][N], col[N][N]; //标记某一行或某一列是否已经填数x了
bool st[N][N][N]; // 判断3*3的小格子里的数是否填过了


bool dfs(int i, int j)
{
	if(j == n) // 一行填满了
	{
		i++;
		j = 0;
	}

	if(i == n) return true;// 找到一种合法情况就停止递归

	//当前位置已经有数了
	if(a[i][j]) return dfs(i, j+1);

	//从1到9尝试填，找到一个合法的数
	for(int k = 1; k <= n; k++)
	{
		if(row[i][k] || col[j][k] || st[i / 3][j / 3][k]) continue;

		a[i][j] = k;
		row[i][k] = col[j][k] = st[i / 3][j / 3][k] = true;
		
		if(dfs(i, j+1)) return true; //找到一个解法就不用尝试下面的数了
		
		//恢复现场
		a[i][j] = 0;
		row[i][k] = col[j][k] = st[i / 3][j / 3][k] = false;
	}

	return false;
}

int main()
{
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cin >> a[i][j];
			int t = a[i][j];
			if(t) 
			{
				//标记已经填了的数
				row[i][t] = col[j][t] = st[i / 3][j / 3][t] = true;
			}
		}
	}

	dfs(0, 0);

	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}